package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController {

    @Autowired
    private RoleService roleService;

    @Autowired
    private ModuleService moduleService;

    /*
        作用：进入角色的列表页面
        路径： /system/role/list.do
        参数： 没有
        返回值： system/role/role-list.jsp
     */
    @RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "5") Integer pageSize
                      ){
        //1. 模拟获取登陆的企业id
        String companyId = getLoginCompanyId();
        //2.  查找到角色
        PageInfo<Role> pageInfo = roleService.findAll(pageNum, pageSize, companyId);
        //3. 把角色信息存储到域中
        request.setAttribute("pageInfo",pageInfo);
        //4. 返回角色列表
        return "system/role/role-list";
    }

    /*
      作用：进入角色的添加
      路径： /system/role/toAdd.do
      参数： 没有
      返回值： system/role/role-add.jsp
   */
    @RequestMapping("/toAdd")
    public String toAdd(){
        //1. 查询所有角色
        String companyId = getLoginCompanyId();
        List<Role> list = roleService.findAllRole(companyId);
        //2. 存储到请求域中
        request.setAttribute("roleList",list);
        //3. 返回到角色的添加页面
        return "system/role/role-add";
    }


    /*
     作用：保存添加与修改
     路径： /system/role/edit.do
     参数： 角色
     返回值：角色列表
  */
    @RequestMapping("/edit")
    public String edit(Role role){
        //1. 给角色补充企业的id与企业名称
        String companyId = getLoginCompanyId();
        String companyName = getLoginCompanyName();
        role.setCompanyId(companyId);
        role.setCompanyName(companyName);
        //2.根据角色的id判断是否是增加还是修改
        if(StringUtils.isEmpty(role.getId())){
            //添加
            roleService.save(role);
        }else{
            //修改
            roleService.update(role);
        }
        //3. 返回角色的列表页面
        return "redirect:/system/role/list.do";
    }


    /*
       作用：进入修改页面
       路径： /system/role/toUpdate.do?id=5af45318-6585-4e8b-85c6-75c1f3bf2c9f
       参数： 角色的id
       返回值：system/role/role-update
    */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id){
        //1. 根据id查询当前角色
        Role role = roleService.findById(id);
        request.setAttribute("role",role);
        //2. 查询所有角色 ： 作业： 查询全部角色的时候把当前角色排除在外，因为自己没法做自己的父角色
        String companyId = getLoginCompanyId();
        List<Role> roleList = roleService.findAllRole(companyId);
        request.setAttribute("roleList",roleList);
        //3. 返回更新页面
        return "system/role/role-update";
    }

    /*
         作用：删除角色
         路径： /system/role/delete.do
         参数： 角色的id
         返回值：角色列表
     */
    @RequestMapping("/delete")
    public String delete(String id){
        //1. 删除角色
         roleService.delete(id);
        return "redirect:/system/role/list.do";
    }


    /*
        作用：进入角色分配权限页面
        路径： /system/role/roleModule.do?roleid=4028a1c34ec2e5c8014ec2ebf8430001
        参数： roleid ： 角色的id
        返回值：system/role/role-module.jsp
    */
    @RequestMapping("/roleModule")
    public String roleModule(String roleid){
        //1. 根据id查找角色
        Role role = roleService.findById(roleid);
        //2. 存储到请求域
        request.setAttribute("role",role);
        //3. 返回到角色权限页面
        return "system/role/role-module";
    }


    /*
        作用：获取ztree所要的数据
        路径： /system/role/getTreeNodes.do?roleid=4028a1c34ec2e5c8014ec2ebf8430001
        参数： roleid ： 角色的id
        返回值：json对象


       返回数据的格式：
            [   List\数组
               { id:1, pId:0, name:"Saas管理", open:true},
               { id:11, pId:1, name:"企业管理", open:true},
               { id:111, pId:1, name:"模块管理"},
            ]
    */
    @RequestMapping("/getTreeNodes")
    @ResponseBody
    public List<Map<String,Object>> getTreeNodes(String roleid) throws IOException {
        //1. 查找出所有的权限
        List<Module> moduleList = moduleService.findAllModule();

        //2. 根据角色的id查出当前角色所拥有的权限
        List<String> modulesIds =  moduleService.findRoleModuleByRoleId(roleid);  //返回集合只是存储了所有的模块id值而已

        //3 定义一个List作为返回结果集
        List<Map<String,Object>> resultList = new ArrayList<>();


        //4. 遍历所有的权限，每一个module就是对应一个Map
        for (Module module : moduleList) {
            //每一个权限对应一个map
            Map<String,Object> map = new HashMap<>();
            map.put("id",module.getId());
            map.put("name",module.getName());
            map.put("pId",module.getParentId());
            map.put("open",true);
            //判断当前遍历的module的id是否包含在moduleIds中。
            if(modulesIds.contains(module.getId())) {
                map.put("checked", true);
            }
            //把map添加到结果集合中
            resultList.add(map);
        }
        return resultList;

    }


    /*
       作用：保存修改角色权限
       路径：/system/role/updateRoleModule.
       参数： roleid ：角色id ，  moduleIds :本次保存的角色对应的权限id  1,2,3,4
       返回值：角色列表
   */
    @RequestMapping("/updateRoleModule")
    public String updateRoleModule(String roleid,String[] moduleIds){
        roleService.updateRoleModule(roleid,moduleIds);
        return "redirect:/system/role/list.do";
    }
}
